package com.cskaoyan.catmall.realm;

import com.cskaoyan.catmall.dao.UserDao;
import com.cskaoyan.catmall.model.pojo.UserPojo;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

/**
 * 自定义的Realm → 获得系统中的认证信息和授权信息
 * @author stone
 * @date 2022/01/10 10:20
 */
@Component("admin")
public class AdminRealm extends AuthorizingRealm {

    //容器中的组件才可以使用注入功能的注解
    //@Autowired
    //AdminMapper adminMapper;

    @Autowired
    UserDao userDao;

    //获得认证信息
    /**
     * 根据token传入的值查询系统的凭证（密码）信息，封装为认证信息
     * @param authenticationToken → 来源于login传入的参数
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        // 用户名
        String principal = (String) authenticationToken.getPrincipal();

        // 查询用户信息
        UserPojo userPojo = userDao.selectUserInfo(principal);

        //根据用户名能否在数据库中查询到密码呢？
        String credentials = queryFromDb(principal);
        //参数1：principal 认证成功后保存在session中的用户信息 → shiro提供的方法获得（subject的方法）
        //放入的信息取决于你自己 → 放入的是什么类型的什么值，取出的就是什么类型的什么值
        //参数2：credentials 凭证信息，来源于数据库的凭证信息
        //参数3：realm的名称
        return new SimpleAuthenticationInfo(userPojo, credentials, getName());
        //构造认证信息：会和token中的密码做比对
    }

    //应该是使用dao层，查询该用户对应的密码
    private String queryFromDb(String principal) {
        //todo: 查询principal(用户名)信息在数据库中的密码
        return userDao.selectUserByUsername(principal);
    }

    //获得授权信息
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        //把当前用户的所有的权限信息找到
        //首先获得当前用户信息 → doGetAuthen方法封装的第一个参数
        UserPojo primaryPrincipal = (UserPojo) principalCollection.getPrimaryPrincipal();
        //根据用户信息查询权限列表
        List<String> permissions = queryPermissionFromDB(primaryPrincipal.getUsername());
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        simpleAuthorizationInfo.addStringPermissions(permissions);
        return simpleAuthorizationInfo;
    }

    private List<String> queryPermissionFromDB(String primaryPrincipal) {
        //todo: 来源于数据库
        String[] strings = userDao.selectUserPermission(primaryPrincipal);
        System.out.println(Arrays.toString(strings));
//        return Arrays.asList(new String[]{"admin:user:list","admin:user:info"});
        return Arrays.asList(strings);
    }



}
